import pandas as pd
import numpy as np

# DataFrame的运算
"""
-- 在运算中自动对齐不同索引的数据
-- 如果索引不对应，则补nan值
-- DataFrame没有广播机制
"""
# 月考成绩1
print("\n月考成绩1")
df1 = pd.DataFrame(
    data =  np.random.randint(10, 100, size=(3, 3)),
    columns=['语文', '数学', '英语'],
    index=['张三', '李四', '王五']
)
print(df1)
# 月考成绩2
print("\n月考成绩2")
df2 = pd.DataFrame(
    data =  np.random.randint(10, 100, size=(3, 3)),
    columns=['语文', '数学', '英语'],
    index=['张三', '李四', '王五']
)
print(df2)

# 1.DataFrame和标量之间的运算
print("\n1.DataFrame和标量之间的运算")
print(df1 + 100)
print(df1 - 100)
print(df1 * 2)
print(df1 / 2)
print(df1 // 2)
print(df1 % 2)
print(df1 ** 2)

# 2.DataFrame之间的运算
print("\n2.DataFrame之间的运算")
print(df1 + df2)  # 行和列必须对应
# 月考成绩3
print("\n月考成绩3")
df3 = pd.DataFrame(
    data =  np.random.randint(10, 100, size=(4, 4)),
    columns=['语文', '数学', '英语', '物理'],
    index=['张三', '李四', '王五','赵六']
)
print(df3)
print(df1+df3) # 行和列不对应，nan值补充
print(df1.add(df3, fill_value=0)) # 行和列不对应，nan值补0
"""
.add()  加法
.sub()  减法
.mul()  乘法
.div()  除法
.floordiv()  整除
.mod()  取余
.pow()  幂
.combine()  合并两个DataFrame
"""
# 3.Series和DataFrame之间的运算
"""
-- 使用python操作符：以行为单位操作（参数必须是行），对所有行都有效
   --  类似于Numpy中二维数组与一维数组的运算，但可能出现Nan
-- 使用pandas方法：
   -- axis=0：以列为单位操作（参数必须是列），对所有列都有效
   -- axis=1：以行为单位操作（参数必须是行），对所有行都有效
   -- fill_value：缺失值填充
"""
print("\n3.Series和DataFrame之间的运算")
s1 = pd.Series(data=[1, 20, 300], index=df1.columns)
print(s1)
print(df1 + s1)
print(df1.add(s1))
print(df1.add(s1, axis=1))

s2 = pd.Series(data=[1, 20, 300], index=df1.index)
print(s2)
print(df1.add(s2, axis=0))
print(df1.add(s2, axis='index'))
